async function loadBuffer(url) {
  const response = await fetch(url);
  const buf = await response.arrayBuffer();
  const buffer = await audioContext.decodeAudioData(buf);
  return buffer;
}

let buffer;
let source;
let audioContext = new AudioContext();
let url = "audio/chrono.mp3";
let playStartTime = 0; // 当前播放开始时的 AudioContext.currentTime
let audioOffset = 0; // 从音频缓冲区的哪个位置开始播放（秒）

async function play() {
  if (!buffer) {
    buffer = await loadBuffer(url);
  }

  // 每次都需要创建新的 source（因为旧的 source 被 stop() 后无法复用）
  source = audioContext.createBufferSource();
  source.buffer = buffer;
  source.connect(audioContext.destination);

  // start() 的第二个参数 offset 指定从音频缓冲区的哪个位置开始播放
  // 这样就能从上次暂停的位置继续播放
  source.start(audioContext.currentTime, audioOffset);

  // 记录当前播放开始的时间，用于计算暂停时的位置
  playStartTime = audioContext.currentTime;
}

function pause() {
  if (source) {
    // 计算已经播放了多长时间，并更新 audioOffset
    const elapsed = audioContext.currentTime - playStartTime;
    audioOffset += elapsed;

    // AudioBufferSourceNode 一旦被 stop() 就不能再复用，必须置为 null
    source.stop();
    source.disconnect();
    source = null;
  }
}

window.addEventListener("keydown", (event) => {
  if (event.key === " ") {
    if (source) {
      pause();
    } else {
      play();
    }
  }

  // 按 'r' 键重置播放位置
  if (event.key === "r" || event.key === "R") {
    pause();
    audioOffset = 0;
  }
});
